home *** CD-ROM | disk | FTP | other *** search
/ Games of Daze / Infomagic - Games of Daze (Summer 1995) (Disc 1 of 2).iso / x2ftp / msdos / mxcode / soundx / timerx.doc < prev    next >
Text File  |  1993-06-27  |  9KB  |  297 lines

  1.  
  2.    Copyright 1993 by Peter Sprenger   Pete@amber.dinoco.de
  3.                      Muenchener Str.6
  4.                      50170 Kerpen
  5.                      Germany
  6.  
  7.    Permission to use, copy, modify, and distribute this
  8.    software and its documentation for any purpose and without
  9.    fee is hereby granted, provided that the above copyright
  10.    notice appear in all copies.  The author Peter Sprenger
  11.    makes no representations about the suitability of this
  12.    software for any purpose.  It is provided "as is" without
  13.    express or implied warranty.
  14.  
  15.  
  16.  
  17.  
  18.  
  19. What is the timerx? Timerx is a by-product that I have written in
  20. two days to support my game library. It is a small library, that
  21. supports the following things:
  22.  
  23. 1.  Joystick routines
  24.  
  25. 2.  Time measurement with timer 2
  26.  
  27. 3.  micro sec delays with and without timer 2
  28.  
  29. 4.  measurement of one vertical blank cycle of a ega,vga card
  30.  
  31. 5.  set own timer 0 intr and clock value without disturbing system
  32.     clock
  33.  
  34. 6.  set Real Time Clock periodically interrupt
  35.  
  36. 7.  lowlevel intr controller functions
  37.  
  38. This small library is FREE! I hope you understand that I minimze
  39. the documentation, because I need a lot of time for my studies.
  40. If somebody finds this routines extremely useful, every kinds of
  41. donations are welcome.
  42.  
  43. No libraries included! It would made this archive bigger and more
  44. important  :-) to fill it with libraries, but since everybody uses
  45. its own c compiler and memory model I think it's stupid!
  46. You can compile it with every memory model you wish.
  47.  
  48. Please, if you have any suggestions, questions or you enhanced this
  49. library contact me! My usenet address is:
  50.  
  51.                                           Pete@amber.dinoco.de
  52.  
  53. Happy hacking,
  54.                Pete
  55.  
  56.  
  57.  
  58.  
  59.  
  60. --------------------  Documentation  ----------------------------
  61.  
  62.  
  63.  
  64.  
  65.  
  66. 1.                    Joystick routines
  67.                       -----------------
  68.  
  69.  
  70. extern WORD tax,tay,tbx,tby; /* values of potentiometer */
  71. extern WORD ba1,ba2,bb1,bb2; /* button values; bit set = pressed */
  72.  
  73. void ReadTJoy(BYTE which);
  74. void ReadTJoy2(BYTE which);
  75. void ReadBJoy();
  76.  
  77. The procedures ReadTJoy and ReadTJoy2 do nearly the same. They fill
  78. the variables tax,tay,tbx,tby with the joystick values. The variable
  79. names correspond:
  80.  
  81. tax  x-channel joystick a
  82. tay  y-channel joystick a
  83. tbx  x-channel joystick b
  84. tby  y-channel joystick b
  85.  
  86. The parameter which determines which channels to query. This prevents
  87. from hitting the timeout, if one of the joysticks are missing.
  88. The operation is: Set which to 0xf to scan all channels. When
  89. ReadTJoy comes back the channels (joysticks) that are missing have an
  90. zero in their variables.
  91.  
  92.          76543210
  93. which parameter: xxxxtttt  if the bit is set the channel is scanned
  94.                      aabb  x = not used
  95.                      xyxy
  96.  
  97. The procedure ReadTJoy uses Timer 2 to measure the joystick values.
  98. It is machine independent. It will give you the same results if
  99. you are on a 286 AT or a fast 486. Please initialize timer 2 before
  100. use. This is done with InitT2().
  101.  
  102. ReadTJoy2 does'nt uses any timer. It IS machine dependant. I made it
  103. just in case you need timer 2 for sound, etc... The routine is
  104. balanced, so you get the same results independant from the joystick
  105. values.
  106.  
  107.  
  108. The Procedure ReadBJoy read the joystick button state. It fills the
  109. variables ba1,ba2,bb1,bb2.
  110.  
  111. ba1  Button 1 joystick a
  112. ba2  Button 2 joystick a
  113. bb1  Button 1 joystick b
  114. bb2  Button 2 joystick a
  115.  
  116. If the button is pressed, the variables are set to TRUE (nonzero).
  117.  
  118.  
  119.  
  120.  
  121.  
  122. 2.                       Timer 2 routines
  123.                          ----------------
  124.  
  125.  
  126. void InitT2();
  127.  
  128.   You initialize Timer 2 with Modus 2 and preload value of 0 (2^16)
  129.   with the call InitT2().
  130.   I use timer 2, because Timer 0 could be programmed in another modus
  131.   and Timer 2 is not used except of some sound routines perhaps.
  132.   
  133. void timer_on();
  134.  
  135.   With timer_on() you start time measurement. It reads the timer value
  136.   and stores it in an internal variable.
  137.  
  138. WORD timer_off();
  139.  
  140.   Timer_off() stops the measurement. Again the timer value is loaded
  141.   and the difference is returned. If the time interval you wanted to
  142.   stop is greater 54ms the result is WRONG. This happens, because the
  143.   timer makes all 54ms one turnaround.
  144.   
  145.   The result you get back is the time in clk's. One clk is 0.838 micro
  146.   sec, since the timer is clocked with 1.19318 Mhz. Sometimes it is
  147.   better to turn intr. off before time measurement. This is accurate,
  148.   but does not represent the real flow in your machine!
  149.  
  150.  
  151.  
  152. 3.                       Micro sec delays
  153.                          ----------------
  154.  
  155.  
  156.  
  157.  
  158. WORD to_micro(WORD clk);
  159.  
  160.   The procedure to_micro converts from clk to micro sec. The
  161.   calculation is easy:   micro_sec = clk * 838 / 1000
  162.  
  163.  
  164. void clkdelay(WORD clicks);
  165.  
  166.   Clkdelay waits a specified amount of clk's. Due to the overhead in
  167.   reading the timer, it's accuracy is about +-3 clk's.
  168.   This function is inaccurate with small delay values. Use clk values
  169.   greater 8.
  170.   
  171.  
  172. void measure();
  173. WORD mcalc(WORD micro);
  174. void mdelay(WORD delay);
  175. void msdelay(WORD delay);
  176.  
  177.   The procedure measure() stops the time of a empty loop:
  178.  
  179.       move cx,10000
  180.   label:
  181.       loop label
  182.  
  183.   The result is stored in an internal variable.
  184.   Now if you want to get the loop repetition factor of e.g. 100 micro
  185.   sec, say: delayf = mcalc(100).
  186.   To wait now 100 micro sec, say: mdelay(delayf).
  187.  
  188.   If you want to wait milisec (not microsec) use msdelay. It will call
  189.   delay * mdelay(mcalc(999)). Not mdelay(mcalc(1000)) because far call
  190.   and ret is about 1 microsec.
  191.   
  192.   /* Example wait 100 micro sec */
  193.      WORD delayf;
  194.   
  195.   
  196.      InitT2();     /* only once */
  197.      measure();    /* only once */
  198.   
  199.      delayf = mcalc(100);
  200.      mdelay(delayf);
  201.   
  202.   /* Example end  */
  203.   
  204.   The procedure mdelay is only a loop, it uses NO timer!
  205.   
  206.   
  207.   
  208.  
  209. 4.            Vertical Blank measurement
  210.                     --------------------------
  211.  
  212.  
  213. WORD vbl_measure();
  214.  
  215.   The function vbl_measure returns the number of clk's between two
  216.   vertical retrace events.
  217.  
  218.  
  219.  
  220.  
  221. 5.                       Timer 0 interrupt
  222.                          -----------------
  223.  
  224.  
  225. void Install_Timer0(WORD period,void (*func)());
  226. void Remove_Timer0();
  227.  
  228.   With these procedures you can set your own timer 0 interrupt routine
  229.   and the time between the interrupts. The time parameter period is in
  230.   timer clk's, and the second parameter is the function pointer to
  231.   your function.
  232.   The use of Install_Timer0 does NOT disturb the system clock. The
  233.   msdos system clock routine is called with 18,206hz like before!
  234.   
  235.   With Remove_Timer0 the old interrupt vector is restored, and timer
  236.   is set at the usual timer value of 0 (2^16).
  237.   
  238.  
  239.  
  240.  
  241.  
  242. 6.                   Real Time Clock interrupt
  243.                      -------------------------
  244.  
  245.  
  246. void Install_RTC(WORD hertz,void (*func)());
  247. void Remove_RTC();
  248.  
  249.   When you call Install_RTC() you can activate the real time clock
  250.   periodical interrupt. With the argument hertz you can set the
  251.   interrupt rate between 2hz and 8192hz. The specs say that values
  252.   over 8192hz will not work. The 2nd argument is a function ptr to
  253.   the user function you want to call at the interrupt.
  254.   
  255.   The procedure Remove_RTC() will disable the periodical interrupt at
  256.   the RTC and restore the old interrupt vector.
  257.   
  258.   With Remove_RTC the old interrupt vector is restored, and the
  259.   interrupt disabled.
  260.  
  261.  
  262.  
  263.  
  264. 7.                 lowlevel intr controller procs
  265.                    ------------------------------
  266.  
  267.  
  268.  
  269. BYTE int2vect(BYTE intnr);
  270. void enable_int(BYTE nr);
  271. void disable_int(BYTE nr);
  272.  
  273.  
  274.   The procedure int2vect() gets the number of an interrupt and returns
  275.   the vector number corresponding to that interrupt. Very simple, only
  276.   design feature!
  277.   
  278.  
  279.   The procedures enable_int()/disable_int() gives you aid in
  280.   enabling/disabling single interrupts in the interrupt controller.
  281.   Call them with interrupt number you want to enable/disable.
  282.   
  283.  
  284. -----------------------------------------------------------
  285.  
  286.  
  287.  
  288. Vers.                          History
  289.                                -------
  290.  
  291.  1.00 02-Jun-93  timerx 1.0 library released
  292.  
  293.  1.10 10-Jun-93  msdelay() added
  294.       14-Jun-93  Real Time Clock functions added
  295.       15-Jun-93  missing cli bug in measure fixed
  296.       22-JUn-93  enable_int(),disable_int(),int2vect() added
  297.